package com.cyh.ebpttoolswar.tools;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Locale;

public class generateMybatiseConfig {
  public static void main(String arg[]) {

    // 生成的表名
    String tableName = "EBPT_AS_TASK";
    // 路径为ebpub-jar目录下
    String outPutDir = ".\\ebptpub-jar\\src\\main\\java\\com\\cyh";

    String[] parts = tableName.toLowerCase(Locale.ROOT).split("_");
    String modelName = parts[2];
    String modeNametTemp = StrUtil.upperFirst(modelName);

    // 1. 全局配置
    GlobalConfig config = new GlobalConfig();
    config
        .setActiveRecord(true) // 是否支持AR模式
        .setAuthor("cyh") // 作者
        // .setOutputDir("D:\\workspace_mp\\mp03\\src\\main\\java") // 生成路径
        .setOutputDir(outPutDir) // 生成路径
        .setFileOverride(true) // 文件覆盖
        // .setIdType(IdType.AUTO) // 主键策略
        // IEmployeeService
        // 生成基本的resultMap
        .setBaseResultMap(true)
        .setBaseColumnList(true); // 生成基本的SQL片段

    // 生成完成后不弹出文件框
    //       config.setOpen(false);
    // 实体属性 Swagger2 注解
    config.setSwagger2(true);
    config.setEnableCache(false); // XML 二级缓存

    // 自定义文件命名，注意 %s 会自动填充表实体属性！
    // dao层
    config.setMapperName(modeNametTemp + "Dao");
    // xml
    config.setXmlName(modeNametTemp + "Dao");
    // entity
    config.setEntityName(modeNametTemp + "Entity");
    // Service
    config.setServiceName(modeNametTemp + "Service");
    // ServiceImp
    config.setServiceImplName(modeNametTemp + "ServiceImp");
    // Logic
    config.setControllerName(modeNametTemp + "Controller");

    DataSourceConfig dsConfig = new DataSourceConfig();
    // dsConfig.setDbType(DbType.MYSQL)  // 设置数据库类型
    dsConfig
        .setDriverName("com.mysql.jdbc.Driver")
        .setUrl(
            "jdbc:mysql://localhost:3306/ebptbase?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")
        .setUsername("ebptdb")
        .setPassword("ebptuser");

    // 3. 策略配置globalConfiguration中
    StrategyConfig stConfig = new StrategyConfig();
    stConfig
        .setCapitalMode(true) // 全局大写命名
        .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
        // .setTablePrefix("tbl_")
        .setInclude(tableName); // 生成的表

    // 4. 包名策略配置
    PackageConfig pkConfig = new PackageConfig();
    pkConfig.setParent("ebptpubjar");
    pkConfig
        .setModuleName(modelName)
        .setMapper("mapper") // dao
        .setService("service") // servcie
        .setController("controller") // controller
        .setEntity("entity")
        .setXml("mapper"); // mapper.xml

    //        // 注入自定义配置，可以在 VM 中使用 cfg.abc 【可无】  ${cfg.abc}
    //        InjectionConfig cfg = new InjectionConfig() {
    //            @Override
    //            public void initMap() {
    //                Map<String, Object> map = new HashMap<String, Object>();
    //                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
    //                this.setMap(map);
    //            }
    //        };
    //
    //        // 自定义 xxListIndex.html 生成
    //        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
    //        focList.add(new FileOutConfig("/templatesMybatis/list.html.vm") {
    //            @Override
    //            public String outputFile(TableInfo tableInfo) {
    //                // 自定义输入文件名称
    //                return "E://test//html//" + tableInfo.getEntityName() + "ListIndex.html";
    //            }
    //        });
    //
    //        // 自定义  xxAdd.html 生成
    //        focList.add(new FileOutConfig("/templatesMybatis/add.html.vm") {
    //            @Override
    //            public String outputFile(TableInfo tableInfo) {
    //                // 自定义输入文件名称
    //                return "E://test//html//" + tableInfo.getEntityName() + "Add.html";
    //            }
    //        });
    //
    //        //  自定义 xxUpdate.html生成
    //        focList.add(new FileOutConfig("/templatesMybatis/update.html.vm") {
    //            @Override
    //            public String outputFile(TableInfo tableInfo) {
    //                // 自定义输入文件名称
    //                return "E://test//html//" + tableInfo.getEntityName() + "Update.html";
    //            }
    //        });
    //
    //        cfg.setFileOutConfigList(focList);

    // 自定义模板配置，可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改，
    // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置，也可以自定义模板名称
    TemplateConfig tc = new TemplateConfig();
    tc.setController("/templatesMybatis/controller");
    tc.setService("/templatesMybatis/service");
    tc.setServiceImpl("/templatesMybatis/serviceImpl");
    tc.setEntity("/templatesMybatis/entity");
    tc.setMapper("/templatesMybatis/dao");
    tc.setXml("/templatesMybatis/mapper");

    // 5. 整合配置
    AutoGenerator ag = new AutoGenerator();

    // 选择 freemarker 引擎，默认 Veloctiy
    ag.setTemplateEngine(new FreemarkerTemplateEngine());
    ag.setGlobalConfig(config)
        .setDataSource(dsConfig)
        .setStrategy(stConfig)
        .setPackageInfo(pkConfig);

    ag.setTemplate(tc);
    // 6. 执行
    ag.execute();
  }
}
